// 演示ctemplate
#include <iostream>
#include <string>
#include <ctemplate/template.h>

int main()
{
    std::string in_html = "./test.html";
    std::string value = "不自由，毋宁死！";
    // float f = 7.28;
    // 形成数据字典
    ctemplate::TemplateDictionary dict("test"); // 类似于 unordered_map<...> test;
    dict.SetValue("key", value);                // 类似于 test["key"] = value;
    // dict.SetFormattedValue("key2", "%f", f);    // 类似于 test["key"] = value;

    // 获取要待渲染的网页对象
    ctemplate::Template* tpl = ctemplate::Template::GetTemplate(in_html, ctemplate::DO_NOT_STRIP);

    // 将字典数据添加到待渲染的网页中
    std::string out_html;
    tpl->Expand(&out_html, &dict);

    // 查看替换后的网页
    std::cout << out_html << std::endl;
}

// 演示 Boost 切分库
// #include <iostream>
// #include <vector>
// #include <boost/algorithm/string.hpp>
// #include <set>

// int main()
// {
//     const std::string str = "1:::回文数:简单:1:5000";
//     std::vector<std::string> tokens;
//     const std::string sep = ":";
//     // boost::split(tokens, str, boost::is_any_of(sep), boost::algorithm::token_compress_on);
//     boost::split(tokens, str, boost::is_any_of(sep), boost::algorithm::token_compress_off);

//     for(auto& s : tokens)
//     {
//         std::cout << s << std::endl;
//     }

//     return 0;
// }

// 演示使用 cpp-httplib
// #include <httplib.h> 

// using namespace httplib;

// int main()
// {
//     Server svr;
//     // 注册回调函数
//     svr.Get("/hello", [](const Request& req, Response& resp){
//         resp.set_content("hello httplib, 你好 httplib！", "text/plain; charset=utf8");
//     });

//     svr.listen("0.0.0.0", 8080); // 启动 http 服务
//     svr.set_base_dir("./wwwroot");

//     return 0;
// }

// 演示使用原生字符串语法
// #include <iostream>

// int main() 
// {
//     std::string rawStr = R"(C:\path\to\file.txt)";
//     std::cout << rawStr << std::endl;

//     std::string multiLineStr = R"(
//         This is a
//         multi-line
//         string
//     )";
//     std::cout << multiLineStr << std::endl;

//     std::string specialChars = R"(\n \t \\)";
//     std::cout << specialChars << std::endl;

//     return 0;
// }


// 演示使用 Jsoncpp
// #include <iostream>
// #include <jsoncpp/json/json.h>

// using namespace std;

// int main()
// {
//     // Value 是一个 Json 的中间类, 可以填充 KV 值
//     // Json 通常用于网络通信中, 将传输的数据进行序列化和反序列化
//     Json::Value person;
//     person["name"] = "John Doe";
//     person["age"] = 30;
//     person["city"] = "New York";

//     Json::StyledWriter writer1;
//     string str1 = writer1.write(person);
//     cout << "\nstr1:\n" << str1 << endl;

//     Json::FastWriter writer2;
//     string str2 = writer2.write(person);
//     cout << "\nstr2:\n" << str2 << endl;

//     return 0;
// }


// 演示资源限制
// #include <iostream>
// #include <sys/resource.h>
// #include <sys/time.h>
// #include <signal.h>
// #include <unistd.h>

// void handler(int signal)
// {
//     std::cout << "signal: " << signal << std::endl;
//     exit(1);
// }

// int main()
// {
//     // 超出资源限制会导致操作系统使用信号来终止进程
//     // 对信号进行捕捉
//     for(int i = 1; i <= 31; ++i) signal(i, handler);

//     // // 限制累计运行时长
//     // struct rlimit r;
//     // r.rlim_cur = 1; // 1s
//     // r.rlim_max = RLIM_INFINITY;
//     // setrlimit(RLIMIT_CPU, &r);
//     // while(1); // 死循环

//     // 对虚拟内存进行限制 
//     struct rlimit r;
//     r.rlim_cur = 1024 * 1024 * 40; // 40M
//     r.rlim_max = RLIM_INFINITY;
//     setrlimit(RLIMIT_AS, &r);

//     int count = 0;
//     while(true)
//     {
//         int *p = new int[1024 * 1024];
//         count++;
//         std::cout << "count: " << count << std::endl;
//         sleep(1);
//     } 

//     return 0;
// }